2010/06/25

Recent entries from same category

  1. Go 言語プログラミングエッセンスという本を書きました。
  2. errors.Join が入った。
  3. unsafe.StringData、unsafe.String、unsafe.SliceData が入った。
  4. Re: Go言語で画像ファイルか確認してみる
  5. net/url に JoinPath が入った。

GoはJavascriptに似た書き方が出来るのだけど、それを利用して何か書けないかなーと思って、cho45さんのJSDeferred書いてみた。
これを使うと、JSDeferredに似た事が出来る。
cho45.stfuawsc.com

JSDeferredSimple and clean asynchronous processing.SampleJSDeferred SamplesDownloadjsdeferred.jsNo c...

http://cho45.stfuawsc.com/jsdeferred/
サンプルだとこんな感じ。 package main

import . "deferred"
import "syscall"
import "http"
import "xml"
import "os"

type feed struct {
    Entry []struct {
        Title string
        Link []struct {
            Rel  string "attr"
            Href string "attr"
        }
        Summary string
    }
}

func main() {
    Deferred().
        Next(func() string {
            return "「この戻り値が...」"
        }).
        Next(func(v string) {
            println("ここの引数にくる!:" + v);
        }).
        Next(func() {
            println("かけっこすものよっといで!");
        }).
        Loop(3, func(i int) {
            println(string("ABC"[i]) + ":はい!");
        }).
        Next(func() {
            println("位置についてよーいどん!");
        }).
        Parallel([]interface{} {
            func() {
                println("A:一番手だしちょっと昼寝してから行くか");
                syscall.Sleep(1000*1000*300);
                println("A:ちょwww");
            },
            func() {
                syscall.Sleep(1000*1000*200);
                println("B:たぶん2位かな?");
            },
            func() {
                syscall.Sleep(1000*1000*100);
                println("C:俺いっちばーん!");
            },
        }).
        Next(func() {
            println("しゅーりょー!");
        }).
        Next(func() {
            println("otsune:ネットウォッチでもするか!");
        }).
        HttpGet("http://b.hatena.ne.jp/otsune/atomfeed").
        Next(func(res *http.Response) *feed {
            var f feed;
            xml.Unmarshal(res.Body, &f);
            return &f
        }).
        Next(func(f *feed) {
            for _, entry := range f.Entry {
                println(entry.Title + "\n\t" + entry.Link[0].Href);
            }
        }).
        HttpGet("http://b.hatena.ne.otsune/"). // this make error
        Next(func(res *http.Response) {
            println("ここにはこないよ");
        }).
        Error(func(err *os.Error) {
            println("これはひどい");
        })
}
Goでは例外がcatch出来ない(そもそもthrowがない)のだけど、Goの風習で戻り値の最後にos.Errorを返す風習があるので、その場合はErrorに飛ばす様にしてある。
mattn's godeferred at master - GitHub

port of jsdeferred: http://cho45.stfuawsc.com/jsdeferred

http://github.com/mattn/godeferred
使い道あるか分かんないけど、とりあえず...
※あんましJSDeferredの仕様詳しく無いので正しい動きじゃないかも苦笑
Posted at by